<?php
App::uses('AppModel', 'Model');
/**
 * Usuario Model
 *
 * @property Endereco $Endereco
 * @property Login $Login
 * @property Login $Login
 * @property Especializacao $Especializacao
 * @property Associacao $Associacao
 * @property Trabalho $Trabalho
 * @property Curso $Curso
 */
class Usuario extends AppModel {

/**
 * Display field
 *
 * @var string
 */
	public $displayField = 'nome';

/**
 * Validation rules
 *
 * @var array
 */
	public $validate = array(
		'email' => array(
			'email' => array(
				'rule' => array('email'),
				'message' => 'E-mail inválido',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
			'unique' => array(
				'rule' => array('isUnique'),
				'message' => 'Esse E-mail já está registrado em nosso servidor',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
			'emailequal'=>array(
				'rule' =>'cmpemails',
				'message' => 'E-mails não conferem!'
			)
		),
		'nome' => array(
			'notempty' => array(
				'rule' => array('notempty'),
				'message' => 'Você deve registrar o seu nome',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'rg' => array(
				'um_doc' => array(
						'rule' => array('um_doc'),
						'message' => 'Você deve registrar ao menos um documento',
						'allowEmpty' => true,
						'required' => false,
						//'last' => false, // Stop validation after this rule
						//'on' => 'create', // Limit validation to 'create' or 'update' operations
				),
		),
		'cpf' => array(
				'um_doc' => array(
						'rule' => array('um_doc'),
						'message' => 'Você deve registrar ao menos um documento',
						'allowEmpty' => true,
						'required' => false,
						//'last' => false, // Stop validation after this rule
						//'on' => 'create', // Limit validation to 'create' or 'update' operations
				),
				'checa_cpf' => array(
						'rule' => array('checa_cpf'),
						'message' => 'CPF inválido',
				),
				'unico' => array(
						'rule' => 'isUnique',
						'message' => 'CPF já cadastrado',
						'required' => 'create'
				)
				
		),
		'passaporte' => array(
				'um_doc' => array(
						'rule' => array('um_doc'),
						'message' => 'Você deve registrar ao menos um documento',
						'allowEmpty' => true,
						'required' => false,
						//'last' => false, // Stop validation after this rule
						//'on' => 'create', // Limit validation to 'create' or 'update' operations
				),
		),
		'sexo' => array(
				'sexo' => array(
						'rule' => '/^[MF]$/',
						'message' => 'Escolha o sexo',
						//'allowEmpty' => false,
						//'required' => false,
						//'last' => false, // Stop validation after this rule
						//'on' => 'create', // Limit validation to 'create' or 'update' operations
				),
		),
		'nome_cracha' => array(
			'notempty' => array(
				'rule' => array('notempty'),
				'message' => 'Você deve escolher um nome para o seu crachá',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'cargo' => array(
			'notempty' => array(
				'rule' => array('notempty'),
				'message' => 'Você deve digitar o seu cargo',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'especializacao_id' => array(
			'numeric' => array(
				'rule' => array('numeric'),
				'message' => 'Você deve escolher uma especialização',
				//'allowEmpty' => false,
				'required' => true,
				//'last' => false, // Stop validation after this rule
				'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'associacao_id' => array(
			'numeric' => array(
				'rule' => array('numeric'),
				'message' => 'Você deve escolher uma associação',
				//'allowEmpty' => false,
				'required' => true,
				//'last' => false, // Stop validation after this rule
				'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
		'apresenta' => array(
			'boolean' => array(
				'rule' => array('boolean'),
				//'message' => 'Your custom message here',
				//'allowEmpty' => false,
				//'required' => false,
				//'last' => false, // Stop validation after this rule
				//'on' => 'create', // Limit validation to 'create' or 'update' operations
			),
		),
	);

	//The Associations below have been created with all possible keys, those that are not needed can be removed

/**
 * hasOne associations
 *
 * @var array
 */
	public $hasOne = array(
		'Endereco' => array(
			'className' => 'Endereco',
			'foreignKey' => 'usuario_id',
			'conditions' => '',
			'fields' => '',
			'dependent' => true,
			'order' => ''
		),
		'Login' => array(
			'className' => 'Login',
			'foreignKey' => 'usuario_id',
			'conditions' => '',
			'fields' => '',
			'dependent' => true,
			'order' => ''
		),
		'Pagamento' => array(
				'className' => 'Pagamento',
				'foreignKey' => 'usuario_id',
				'conditions' => '',
				'fields' => '',
				'dependent' => true,
				'order' => ''
		),
		'StatusAtual' => array(
				'className'=>'PagseguroTransacao',
				'foreignKey'=>'pagamento_id',
				'order'=>'date DESC'
		)
	);

/**
 * belongsTo associations
 *
 * @var array
 */
	public $belongsTo = array(
		'Especializacao' => array(
			'className' => 'Especializacao',
			'foreignKey' => 'especializacao_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		),
		'Associacao' => array(
			'className' => 'Associacao',
			'foreignKey' => 'associacao_id',
			'conditions' => '',
			'fields' => '',
			'order' => ''
		)
	);

/**
 * hasMany associations
 *
 * @var array
 */
	public $hasMany = array(
		'Trabalho' => array(
			'className' => 'Trabalho',
			'foreignKey' => 'usuario_id',
			'dependent' => true,
			'conditions' => '',
			'fields' => '',
			'order' => '',
			'limit' => '',
			'offset' => '',
			'exclusive' => '',
			'finderQuery' => '',
			'counterQuery' => ''
		),
		'Telefone' => array(
			'className' => 'Telefone',
			'foreignKey' => 'usuario_id',
			'dependent' => true,
			'conditions' => '',
			'fields' => '',
			'order' => '',
			'limit' => '',
			'offset' => '',
			'exclusive' => '',
			'finderQuery' => '',
			'counterQuery' => ''
		),
	);


/**
 * hasAndBelongsToMany associations
 *
 * @var array
 */
	public $hasAndBelongsToMany = array(
		'Curso' => array(
			'className' => 'Curso',
			'joinTable' => 'cursos_usuarios',
			'foreignKey' => 'usuario_id',
			'associationForeignKey' => 'curso_id',
			'unique' => 'keepExisting',
			'conditions' => '',
			'fields' => '',
			'order' => '',
			'limit' => '',
			'offset' => '',
			'finderQuery' => '',
			'deleteQuery' => '',
			'insertQuery' => ''
		)
	);
	
	public function calculaHash($dados){
		return Security::hash($dados['Usuario']['email'].$dados['Login']['login']);
	}
	
	public function listDeRevisores(){
		$ids = $this->Login->idsDeRevisores();
		return($this->find('list', array('conditions'=>array('id'=>$ids))));
	}
	
	public function um_doc($data){
		//TODO tirar required do campo e tratar string vazia
		return (!empty($this->data['Usuario']['cpf']) || !empty($this->data['Usuario']['rg']) || !empty($this->data['Usuario']['passaporte']));
	}
	
	function cmpemails(){
		if(isset($this->data[$this->alias]['confirmacao_email'])){
			return strcmp($this->data[$this->alias]['email'],$this->data[$this->alias]['confirmacao_email']) == 0;
		}
		return true;
	}
	
	public function findLoginById($id){
		$data = $this->findById($id);
		return $data['Login']['login'];
	}
	public function checa_cpf() {
		pr($this->data[$this->alias]);
		if(!empty($this->data[$this->alias]['cpf'])){
			$cpf = $this->data[$this->alias]['cpf'];
			// Verifica se nenhuma das sequências abaixo foi digitada, caso seja, retorna falso
			if ($cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || $cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || $cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || $cpf == '99999999999')
			{
				return false;
			}
			else
			{   // Calcula os números para verificar se o CPF é verdadeiro
			for ($t = 9; $t < 11; $t++) {
				for ($d = 0, $c = 0; $c < $t; $c++) {
					$d += $cpf{$c} * (($t + 1) - $c);
				}
			
				$d = ((10 * $d) % 11) % 10;
			
				if ($cpf{$c} != $d) {
					return false;
				}
			}
		}
		return true;
		}
	}
}